{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# import regression\n",
    "from regression import StandRegre\n",
    "from regression import Lwlr\n",
    "from regression import RidgeRegre\n",
    "from regression import StageWise\n",
    "import numpy as np\n",
    "import utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "xArr.shape =  (200, 2)\n",
      "yArr.shape =  (200,)\n"
     ]
    }
   ],
   "source": [
    "xArr,yArr=utils.loadDataSet('ex0.txt')\n",
    "print (\"xArr.shape = \", xArr.shape)\n",
    "print (\"yArr.shape = \", yArr.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "xArr.shape =  (200, 2)  \n",
    "yArr.shape =  (200,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ws =  [[3.00774324]\n",
      " [1.69532264]]\n"
     ]
    }
   ],
   "source": [
    "# 直接用公式计算线性回归的闭式解\n",
    "regression = StandRegre(xArr, yArr, xArr, yArr)\n",
    "ws = regression.train()\n",
    "\n",
    "print (\"ws = \", ws)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "ws =  [[3.00774324]  \n",
    " [1.69532264]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "predict_y = regression.predict()\n",
    "x = xArr[:,1]\n",
    "y = yArr\n",
    "utils.plotResult(x, y, predict_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.98647356],\n",
       "       [0.98647356, 1.        ]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.corrcoef(predict_y, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "array([[1.        , 0.98647356],  \n",
    "       [0.98647356, 1.        ]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 局部加权线性回归， locally weighted linear regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "xArr,yArr=utils.loadDataSet('ex0.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "regression = Lwlr(xArr, yArr, xArr, yArr)\n",
    "predict_y = regression.train_and_predict(0.01)\n",
    "utils.plotResult(xArr[:,1], yArr, predict_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "predict_y = regression.train_and_predict(1.0)\n",
    "utils.plotResult(xArr[:,1], yArr, predict_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "predict_y = regression.train_and_predict(0.003)\n",
    "utils.plotResult(xArr[:,1], yArr, predict_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Abalone Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "abX,abY=utils.loadDataSet('abalone.txt')\n",
    "train_X, train_y, test_X, test_y = abX[0:99],abY[0:99],abX[100:199],abY[100:199]\n",
    "reg1 = Lwlr(train_X, train_y, train_X, train_y)\n",
    "reg2 = Lwlr(train_X, train_y, test_X, test_y)\n",
    "\n",
    "def testLwlr(reg, k):\n",
    "    predict_y = reg.train_and_predict(k)\n",
    "    error = utils.rssError(predict_y, reg.test_y)\n",
    "    print (\"k = \", k, \", error = \", error)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k =  0.1 , error =  56.81549669032892\n",
      "k =  1 , error =  429.8905618702056\n",
      "k =  10 , error =  549.1181708826584\n"
     ]
    }
   ],
   "source": [
    "reg1 = Lwlr(train_X, train_y, train_X, train_y)\n",
    "testLwlr(reg1, 0.1)\n",
    "testLwlr(reg1, 1)\n",
    "testLwlr(reg1, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "k =  0.1  error =  56.81549669032892  \n",
    "k =  1  error =  429.8905618702056  \n",
    "k =  10  error =  549.1181708826584"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k =  0.1 , error =  40659.27596541478\n",
      "k =  1 , error =  573.5261441898057\n",
      "k =  10 , error =  517.5711905382693\n"
     ]
    }
   ],
   "source": [
    "reg2 = Lwlr(train_X, train_y, test_X, test_y)\n",
    "testLwlr(reg2, 0.1)\n",
    "testLwlr(reg2, 1)\n",
    "testLwlr(reg2, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "k =  0.1 , error =  40659.27596541478  \n",
    "k =  1 , error =  573.5261441898057  \n",
    "k =  10 , error =  517.5711905382693"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "518.6363153248217"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regression = StandRegre(train_X, train_y, test_X, test_y)\n",
    "regression.train()\n",
    "predict_y = regression.predict()\n",
    "utils.rssError(predict_y, test_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  518.6363153248217"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Ridge Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(30, 8)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "abX,abY= utils.loadDataSet('abalone.txt')\n",
    "X = utils.standardization(np.array(abX))\n",
    "regression = RidgeRegre(X, abY, None, None)\n",
    "ws = np.zeros((0, X.shape[1]))\n",
    "for i in range(-10, 20):\n",
    "    w = regression.train(np.exp(i)).T\n",
    "    ws = np.vstack([ws, w])\n",
    "\n",
    "print (ws.shape)\n",
    "plt.plot(ws)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stage Wise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.01])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xArr,yArr=utils.loadDataSet('abalone.txt')\n",
    "X = utils.standardization(np.array(xArr))\n",
    "regression = StageWise(X, yArr, None, None)\n",
    "regression.train(0.01,200)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "array([ 0.  ,  0.  ,  0.  ,  0.32,  0.  , -0.08,  0.  ,  1.6 ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.001])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# stageWise(xArr,yArr,0.001,5000)\n",
    "regression.train(0.001,5000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "array([ 0.   ,  0.   ,  0.645,  0.451,  0.   , -1.553,  0.   ,  2.351])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.05235616],\n",
       "       [-0.18938966],\n",
       "       [ 1.33168957],\n",
       "       [ 0.49619321],\n",
       "       [ 4.53579572],\n",
       "       [-4.50107876],\n",
       "       [-1.06982725],\n",
       "       [ 1.19429503]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = utils.standardization(np.array(xArr))\n",
    "y = np.array(yArr)\n",
    "regression = StandRegre(X, y, None, None)\n",
    "regression.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expect Result:  \n",
    "\n",
    "array([[ 0.05235616],  \n",
    "       [-0.18938966],  \n",
    "       [ 1.33168957],   \n",
    "       [ 0.49619321],  \n",
    "       [ 4.53579572],  \n",
    "       [-4.50107876],  \n",
    "       [-1.06982725],  \n",
    "       [ 1.19429503]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 这个函数要运行很久\n",
    "# plotStageWise()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "谷歌网站访问不了，后面的例子没有做"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
